import { HttpException, Injectable } from '@nestjs/common';
import { CreateSqlMtmDto, TagsDto } from './dto/create-sql-mtm.dto';
import { UpdateSqlMtmDto } from './dto/update-sql-mtm.dto';
import { Tags } from '@/entity/bookTags/tags.entity';
import { Book } from '@/entity/bookTags/book.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

@Injectable()
export class SqlMtmService {
  constructor(
    @InjectRepository(Tags) private readonly tagsRepository: Repository<Tags>,
    @InjectRepository(Book) private readonly bookRepository: Repository<Book>,
  ) { }

  /**
   * 创建书籍
   * 先创建的tag标签，然后再创建书，书籍可以选择多个标签
   * @param createSqlMtmDto 
   */
  async create(createSqlMtmDto: CreateSqlMtmDto) {
    try {
      const book = new Book()
      book.name = createSqlMtmDto.name

      // 如果有标签，则创建标签
      if (createSqlMtmDto.tags) {
        // const tags = []
        // for (let i = 0; i < createSqlMtmDto.tags.length; i++) {
        //   const tag = await this.tagsRepository.findOne({
        //     where: {
        //       id: createSqlMtmDto.tags[i]
        //     }
        //   })
        //   if (tag) {
        //     tags.push(tag)
        //   }
        // }
        const tags = await this.tagsRepository.find({
          where: createSqlMtmDto.tags.map(id => ({ id })),
        });
        book.tags = tags
      }

      return this.bookRepository.save(book)
    } catch (error) {
      throw new HttpException('创建失败', 500)
    }
  }



  /**
   * 创建tag标签
   */
  createTag(createSqlMtmDto: CreateSqlMtmDto) {
    const tag = new Tags()
    tag.name = createSqlMtmDto.name
    return this.tagsRepository.save(tag)

  }

  findAll() {
    return this.bookRepository.find({
      relations: ['tags']
    })
  }

  findOne(id: number) {
    return this.bookRepository.findOne({
      where: {
        id: id
      },
      relations: ['tags']
    })
  }

  /**
   * 更新后取消关联的中间表里面的对应关系也没了，不像一对多只是置空
   */
  async updateBook(updateSqlMtmDto: CreateSqlMtmDto) {
    try {
      if (!updateSqlMtmDto.id) {
        throw new HttpException('id不能为空', 500)
      }

      const book = await this.bookRepository.findOne({
        where: {
          id: updateSqlMtmDto.id
        },
        relations: ['tags']
      })

      if (!book) {
        throw new HttpException('book不存在', 500)
      }

      book.name = updateSqlMtmDto.name

      // 直接覆盖更新
      if (updateSqlMtmDto.tags) {
        const tags = await this.tagsRepository.find({
          where: updateSqlMtmDto.tags.map(id => ({ id })),
        });
        book.tags = tags;
      }

      // 自己写的，写的很复杂了
      // if (updateSqlMtmDto.tags) {
      //   // 修改，将多余的删除
      //   for (let i = 0; i < book.tags.length; i++) {
      //     const tagItem = book.tags[i]
      //     const tag = updateSqlMtmDto.tags.find(id => id === tagItem.id);
      //     if (!tag) {
      //       book.tags.splice(i, 1);
      //       i--;
      //     }
      //   }

      //   // 新增,可能有新增的
      //   for (let i = 0; i < updateSqlMtmDto.tags.length; i++) {
      //     const id = updateSqlMtmDto.tags[i];
      //     const tag = book.tags.find(item => item.id === id);
      //     if (!tag) {
      //       const newTag = await this.tagsRepository.findOne({
      //         where: {
      //           id: id
      //         }
      //       })
      //       if (newTag) {
      //         book.tags.push(newTag)
      //       }
      //     }

      //   }
      // }


      return this.bookRepository.save(book)

    } catch (error) {
      throw new HttpException('更新失败' + error.message, 500)

    }
  }

  /**
   * 
   * @param updateSqlMtmDto 
   */
  updateTag(updateSqlMtmDto: UpdateSqlMtmDto) {
    return this.tagsRepository.save(updateSqlMtmDto)

  }

  async remove(id: number) {
    try {
      if (!id) {
        throw new HttpException('id不能为空', 500)
      }
      // 要加await，不能失败没有进入全局异常过滤器
      return await this.bookRepository.delete(id)
    } catch (error) {
      throw new HttpException('删除失败' + error.message, 500)
    }
  }

  removeTag(id: number) {
    try {
      if (!id) {
        throw new HttpException('id不能为空', 500)
      }
      return this.tagsRepository.delete(id)
    } catch (error) {
      throw new HttpException('删除失败' + error.message, 500)

    }
  }
}
